华为OJ迷宫问题

描述

定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: 


int maze[5][5] = {


        0, 1, 0, 0, 0,


        0, 1, 0, 1, 0,


        0, 0, 0, 0, 0,


        0, 1, 1, 1, 0,


        0, 0, 0, 1, 0,


};


它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。

Input

一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

Sample Output

(0, 0)

(1, 0)

(2, 0)

(2, 1)

(2, 2)

(2, 3)

(2, 4)

(3, 4)

(4, 4)
 

 

 

知识点 查找,搜索,排序
运行时间限制 10M
内存限制 128
输入

输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

输出

左上角到右下角的最短路径,格式如样例所示。

样例输入 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
样例输出 (0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4)
#include <iostream>  
#include <string>  
#include <vector>
#include <algorithm>
#include <map>
#include <deque>
//#include "Customer.h"
using namespace std;

struct Point
{
	int x;
	int y;
};
int mat[100][100] = { 0 };
int N, M;
deque<Point> path;
deque<Point> minPath;

//判断当前点是否可行
bool correct(int i, int j)
{
	if ((i >= 1 && i <= N) && (j >= 1 && j <= M) && mat[i][j] == 0)
		return true;
	else
		return false;
}
//采用回溯法解决迷宫最短路径问题,遍历所有可行路径path,minPath保存最短路径
void visit(int i, int j)
{
	mat[i][j] = 2;
	Point pt;
	pt.x = i;
	pt.y = j;
	path.push_back(pt);
	if (i == N && j == M)
	{
		if (minPath.empty() || path.size() < minPath.size())
		{
			minPath.assign(path.begin(), path.end());
		}
		mat[i][j] = 0;
		path.pop_back();
		return;
	}

	if (correct(i - 1, j))
	{
		visit(i - 1, j);
	}
	if (correct(i + 1, j))
	{
		visit(i + 1, j);
	}
	if (correct(i, j - 1))
	{
		visit(i, j - 1);
	}
	if (correct(i, j + 1))
	{
		visit(i, j + 1);
	}

	mat[i][j] = 0;
	path.pop_back();
}
int main()
{

	cin >> N >> M;
	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j <= M; j++)
			cin >> mat[i][j];
	}

	visit(1, 1);
	for (int i = 0; i < minPath.size(); i++)
		cout << "(" << minPath[i].x-1 << "," << minPath[i].y -1<< ")" << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值